-
Notifications
You must be signed in to change notification settings - Fork 4
상세 페이지
JM Lee edited this page Jul 7, 2023
·
4 revisions
✔️ 상세페이지
- 게시글과 게시글에 딸린 댓글, 대댓글을 보여주는 페이지
- 수정과 삭제 버튼을 통해 게시글을 수정, 삭제할 수 있다.
- 게시글이 삭제되면 댓글과 대댓글도 같이 삭제된다.
- 재료가 적혀있을 시, 재료에 쿠팡 링크도 같이 나타난다.
💻 code
articles/views.py(게시글 RUD)
class ArticleDetailView(APIView):
def get(self, request, article_id):
article = get_object_or_404(Article, id=article_id)
serializer = ArticleDetailSerializer(
article,
context={"request": request},
)
return Response(serializer.data)
def put(self, request, article_id):
art_put = get_object_or_404(Article, id=article_id)
if request.user == art_put.author:
serializer = ArticleSerializer(
art_put, data=request.data, context={"request": request}
)
if serializer.is_valid():
serializer.save()
return Response(serializer.data, status=status.HTTP_200_OK)
return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST)
def delete(self, request, article_id):
art_del = get_object_or_404(Article, id=article_id)
if request.user == art_del.author:
art_del.delete()
return Response(
{"message": "게시글이 삭제되었습니다"}, status=status.HTTP_204_NO_CONTENT
)
return Response(
{"error": "본인이 작성한 게시글만 삭제할수 있습니다"}, status=status.HTTP_403_FORBIDDEN
)
views.py(재료RUD)
class IngredientDetailView(APIView):
def get(self, request):
ingredient = get_object_or_404(Ingredient, id=id)
serialize = IngredientSerializer(ingredient)
return Response(serialize.data, status=status.HTTP_200_OK)
def put(self, request, article_id):
ing_put = get_object_or_404(Ingredient, id=article_id)
if request.user == ing_put.user:
serializer = IngredientSerializer(ing_put, data=request.data)
if serializer.is_valid():
serializer.save()
return Response(serializer.data, status=status.HTTP_200_OK)
return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST)
def delete(self, request, article_id):
ing_del = get_object_or_404(Article, id=article_id)
if request.user == ing_del.user:
ing_del.delete()
return Response(
{"message": "재료가 삭제되었습니다"}, status=status.HTTP_204_NO_CONTENT
)
return Response(
{"error": "본인이 작성한 재료만 삭제할수 있습니다"}, status=status.HTTP_403_FORBIDDEN
)
views.py(댓글RUD)
class CommentView(generics.ListCreateAPIView):
permission_classes = [permissions.IsAuthenticatedOrReadOnly]
pagination_class = CommentPagination
serializer_class = CommentSerializer
queryset = None
def get_queryset(self):
queryset = Comment.objects.filter(article_id=self.article_id)
order = self.request.GET.get("order", None)
if order == "1":
return queryset.order_by("-like_count")
if order == "2":
return queryset.order_by("created_at")
return queryset.order_by("-created_at")
def get(self, request, *args, **kwargs):
self.article_id = kwargs.get("article_id")
return super().get(request, *args, **kwargs)
class CommentDetailView(APIView):
def put(self, request, article_id, comment_id):
comment = get_object_or_404(Comment, id=comment_id)
if request.user == comment.author:
serializer = CommentSerializer(
comment, data=request.data, context={"request": request}
)
if serializer.is_valid():
serializer.save()
return Response(serializer.data, status=status.HTTP_200_OK)
return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST)
return Response(
{"error": "본인이 작성한 댓글만 수정할수 있습니다"}, status=status.HTTP_403_FORBIDDEN
)
def delete(self, request, article_id, comment_id):
comment = get_object_or_404(Comment, id=comment_id)
if request.user == comment.author:
comment.delete()
return Response("댓글이 삭제되었습니다", status=status.HTTP_204_NO_CONTENT)
return Response("본인이 작성한 댓글만 삭제할수 있습니다", status=status.HTTP_403_FORBIDDEN)
views.py(대댓글RUD)
class RecommentView(generics.ListCreateAPIView):
permission_classes = [permissions.IsAuthenticatedOrReadOnly]
pagination_class = ReCommentPagination
serializer_class = RecommentSerializer
queryset = None
def get_queryset(self):
queryset = Recomment.objects.filter(
article_id=self.article_id, comment_id=self.comment_id
)
order = self.request.GET.get("order", None)
if order == "1":
return queryset.order_by("-like_count")
if order == "2":
return queryset.order_by("created_at")
return queryset.order_by("-created_at")
def get(self, request, *args, **kwargs):
self.article_id = kwargs.get("article_id")
self.comment_id = kwargs.get("comment_id")
return super().get(request, *args, **kwargs)
class RecommentDetailView(APIView):
def put(self, request, article_id, comment_id, recomment_id):
recomment = get_object_or_404(Recomment, id=recomment_id)
if request.user == recomment.author:
serializer = RecommentSerializer(
recomment, data=request.data, context={"request": request}
)
if serializer.is_valid():
serializer.save()
return Response(serializer.data, status=status.HTTP_200_OK)
return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST)
return Response(
{"error": "본인이 작성한 대댓글만 수정할수 있습니다"}, status=status.HTTP_403_FORBIDDEN
)
def delete(self, request, article_id, comment_id, recomment_id):
recomment = get_object_or_404(Recomment, id=recomment_id)
if request.user == recomment.author:
recomment.delete()
return Response(
{"message": "대댓글이 삭제되었습니다"}, status=status.HTTP_204_NO_CONTENT
)
return Response(
{"error": "본인이 작성한 댓글만 삭제할수 있습니다"}, status=status.HTTP_403_FORBIDDEN
)
views.py(게시글, 댓글, 대댓글 좋아요)
class ArticleLikeView(APIView):
permission_classes = [permissions.IsAuthenticated]
def post(self, request, article_id):
"""게시글 좋아요 누르기"""
article = get_object_or_404(Article, id=article_id)
if request.user in article.like.all():
article.like.remove(request.user)
return Response("dislike", status=status.HTTP_200_OK)
else:
article.like.add(request.user)
return Response("like", status=status.HTTP_200_OK)
class CommentLikeView(APIView):
permission_classes = [permissions.IsAuthenticated]
def post(self, request, comment_id):
"""댓글 좋아요 누르기"""
comment = get_object_or_404(Comment, id=comment_id)
if request.user in comment.like.all():
comment.like.remove(request.user)
return Response("dislike", status=status.HTTP_200_OK)
else:
comment.like.add(request.user)
return Response("like", status=status.HTTP_200_OK)
class ReCommentLikeView(APIView):
permission_classes = [permissions.IsAuthenticated]
def post(self, request, recomment_id):
"""댓글 좋아요 누르기"""
recomment = get_object_or_404(Recomment, id=recomment_id)
if request.user in recomment.like.all():
recomment.like.remove(request.user)
return Response("dislike", status=status.HTTP_200_OK)
else:
recomment.like.add(request.user)
return Response("like", status=status.HTTP_200_OK)
📷 View